]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Add support for inhibiting automount
authorHans de Goede <hdegoede@redhat.com>
Tue, 26 Jun 2012 09:26:36 +0000 (11:26 +0200)
committerAdel Gadllah <adel.gadllah@gmail.com>
Fri, 6 Jul 2012 06:28:29 +0000 (08:28 +0200)
When connecting to virtual machines with usb-device redirection, such as Spice
enabled vms, automount may get in the way. Specifically if auto-usbredir is
enabled in the vm-viewer, then the usbredir code and the automount code race
for who gets to the device first.

If the automount code wins the race this is a problem, since usbredir causes a
device-disconnect (iow the usb mass storage driver sees an unplug), so in the
end usbredir always wins, and we end up with a non clean potentially corrupt
filesystem. Also see:
https://bugzilla.redhat.com/show_bug.cgi?id=812972

There for the need exists to be able to inhibit gnome-shell's automounting,
since all other inhibits run through gnome-session, I've chosen to do the same
for the automount-inhibiting. I've also submitted a patch to gnome-session to
reserve flag value 16 for this, see bug 678595.

This patch adds support to gnome-shell to honor this new inhibit flag.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
https://bugzilla.gnome.org/show_bug.cgi?id=678597

js/misc/gnomeSession.js
js/ui/automountManager.js

index 3428aab0e8e3a08b711ba14dd82c516c25bb6289..dabd1b19c5f3c5521bc074a1ff70fc37d9902c9d 100644 (file)
@@ -53,6 +53,16 @@ const SessionManagerIface = <interface name="org.gnome.SessionManager">
 <method name="CanShutdown">
     <arg type="b" direction="out" />
 </method>
+<method name="IsInhibited">
+    <arg type="u" direction="in" />
+    <arg type="b" direction="out" />
+</method>
+<signal name="InhibitorAdded">
+    <arg type="o" direction="out"/>
+</signal>
+<signal name="InhibitorRemoved">
+    <arg type="o" direction="out"/>
+</signal>
 </interface>;
 
 var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface);
index 12ba99ce5432d774cbcd783a17c72bd77f2fd845..9a6f7f67317dfe2e1d815b30c97ffb0c6b7cb0f7 100644 (file)
@@ -10,6 +10,9 @@ const Shell = imports.gi.Shell;
 const Main = imports.ui.main;
 const ShellMountOperation = imports.ui.shellMountOperation;
 const ScreenSaver = imports.misc.screenSaver;
+const GnomeSession = imports.misc.gnomeSession;
+
+const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
 
 // GSettings keys
 const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
@@ -79,6 +82,12 @@ const AutomountManager = new Lang.Class({
     _init: function() {
         this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
         this._volumeQueue = [];
+        this._session = new GnomeSession.SessionManager();
+        this._session.connectSignal('InhibitorAdded',
+                                    Lang.bind(this, this._InhibitorsChanged));
+        this._session.connectSignal('InhibitorRemoved',
+                                    Lang.bind(this, this._InhibitorsChanged));
+        this._inhibited = false;
 
         if (!haveSystemd())
             this.ckListener = new ConsoleKitManager();
@@ -108,6 +117,16 @@ const AutomountManager = new Lang.Class({
         Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
     },
 
+    _InhibitorsChanged: function(object, senderName, [inhibtor]) {
+        this._session.IsInhibitedRemote(GNOME_SESSION_AUTOMOUNT_INHIBIT,
+            Lang.bind(this,
+                function(result, error) {
+                    if (!error) {
+                        this._inhibited = result[0];
+                    }
+                }));
+    },
+
     _screenSaverActiveChanged: function(object, senderName, [isActive]) {
         if (!isActive) {
             this._volumeQueue.forEach(Lang.bind(this, function(volume) {
@@ -219,6 +238,9 @@ const AutomountManager = new Lang.Class({
             }
         }
 
+        if (this._inhibited)
+            return;
+
         // Volume is already mounted, don't bother.
         if (volume.get_mount())
             return;